/**
 * 数组比较的返回结果
 */
interface CompareArrayResult<T>{
    add: T[]
    del: T[]
}

/**
 * 数组工具类
 */
export default class ArrayUtil {

    /**
     * 检查对象是不是数组
     */
    public static isArray(value: unknown): boolean{
        return Array.isArray(value);
    }

    /**
     * 比较两个数组的差异
     * @param target 目标数组, 需要进行比较的数组
     * @param source 原始数组
     * @return CompareArrayResult[] | null 如果为null 表示没有差异
     */
    public static compareArray<T, >(target: T[], source: T[]): CompareArrayResult<T> | null{
        if (!(ArrayUtil.isArray(target) && ArrayUtil.isArray(source))){
            throw new Error("Error in method parameters.");
        }
        const tempAdd: T[] = [];
        const tempDel: T[] = [];
        source.forEach(s => {
            // 如果target中没有该元素, 则表示这个元素被删除了
            if (!target.includes(s)){
                tempDel.push(s);
            }
        });
        target.forEach(t => {
            // 如果source中没有该元素, 则表示这个元素被添加了
            if (!source.includes(t)){
                tempAdd.push(t);
            }
        });
        // 如果两个数组都为空, 则表示没有差异
        if (tempAdd.length === 0 && tempDel.length === 0){
            return null;
        }
        return {
            add: tempAdd,
            del: tempDel
        }
    }
}